// Este programa decodifica un mensaje cifrado
//atravez de una matriz y una llave
//  Espia Version 1.0.0.0
//
//  Created by Sebastian  Galindo on 16/07/12.
//  Copyright (c) 2012 Cinvestav. All rights reserved.
//

#include <iostream>

using namespace std;

int main()
{
    ////////////Variables para el programa////////////
    /**/  unsigned char Matriz_de_Cifrado[200][200],Pocision_Actual ;
    /**/  unsigned int Columnas,Filas,Limite_Superior,Limite_Inferior,Limite_Derecho,Limite_Izquierdo;
    //  unsigned long;
    /**/  char Mensaje_Usuario [400];
    //  int;
    //  long;
    ////////////////////////////////////////////////////
    //system("clear");

    cout << "Mensaje a descifrar es : " << endl;
    cin.getline(Mensaje_Usuario,400);
    cout << "Introduce C" <<endl;
    cin  >> Columnas;
    cout << "Introduce R" <<endl;
    cin  >> Filas;

//    system("clear");
    /**************************************************************/
   /********************Se Ordena por Renglones**********************/
    Pocision_Actual =0;
    for (unsigned char i = 1; i <= Filas; i++)
    {
        for (unsigned char b = 1; b <= Columnas ; b++,Pocision_Actual++)
        {
            Matriz_de_Cifrado[i][b]     =  Mensaje_Usuario [Pocision_Actual];

        }

    }


    /////////////Aqui se Forma la Matiz de decodifiacion //////////
    Limite_Derecho      =   Columnas ;
    Limite_Izquierdo    =   1        ;
    Limite_Superior     =   Filas    ;
    Limite_Inferior     =   1        ;
    Pocision_Actual     =   0        ;
    while((Pocision_Actual)!= (Filas*Columnas))
    {

  for(unsigned char a = Limite_Izquierdo ;a <= Limite_Derecho; a++,Pocision_Actual++)
       {
             Mensaje_Usuario[Pocision_Actual] = Matriz_de_Cifrado[Limite_Inferior][a]    ;
       }

       Limite_Inferior++;
        for(unsigned char a = (Limite_Inferior) ;a <= Limite_Superior; a++,Pocision_Actual++)
        {
              Mensaje_Usuario[Pocision_Actual] = Matriz_de_Cifrado[a][Limite_Derecho]  ;
        }
        Limite_Derecho--;
        for(unsigned char a = Limite_Derecho;a >= Limite_Izquierdo; a--,Pocision_Actual++)
        {
            Mensaje_Usuario[Pocision_Actual]  = Matriz_de_Cifrado[Limite_Superior][a];
        }
        Limite_Superior--;
        for(unsigned char a = (Limite_Superior) ;a >= Limite_Inferior; a--,Pocision_Actual++)
        {
            Mensaje_Usuario[Pocision_Actual]  = Matriz_de_Cifrado[a][Limite_Izquierdo]   ;
        }
        Limite_Izquierdo++;


    }

    cout << "El Mensaje es " << endl;
    /*****************************************************************/
    Pocision_Actual = 0;
    // En el seguiente bloque se aplica la llave de decodificacion//
    for(unsigned int a = 0; a <= (Filas*Columnas);a++)
    {
        Mensaje_Usuario[a] -= 7;

    }

        /////// Aqui se presenta la matriz en un solo renglon /////////////////////////7
    for(unsigned char a = 0 ;a <  (Filas*Columnas) ; a++)
    {
        cout << Mensaje_Usuario[a];

    }
    return 0;
}
